# @author hjc
# @date 2024/4/12 16:23

import numpy as np

# numpy介绍
# NumPy是Numerical Python的缩写，它是Python语言的一个第三方扩展程序库，
# numpy是Python中科学计算的基础包，用于处理多维数组。它提供了一个快速且节省内存的数组对象，以及用于处理数组的各种函数和工具。

# ndarray对象是NumPy库里的重要基础，是N-dimensional array的缩写，其中文含义是N维数组，具体包括一维数组或多维数组。
# 与之前提到的list数据结构不同的是，在同一个ndarray对象里，不能存储类型不同的数据
# 创建一个一维数组
a = np.array([1, 2, 3, 4, 5])
# 创建一个二维数组
b = np.array([[1, 2], [3, 4], [5, 6]])
# 创建一个三维数组
c = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(a)
print(b)
print(c)

# dtype可以用来设置ndarray对象的类型
# 如果需要用ndarray存储含unicode编码的字符串，比如中文字符串，可以通过dtype指定unicode_，
# 如果要存储一般字符串，则可以使用str，如果要使用byte类型的字符串，则可以使用string_。
arr1 = np.array([1, 2, 3], dtype=np.int32)
arr2 = np.array([1, 2, 3], dtype=np.float64)
arr3 = np.array([1, 2, "5", "kl"], dtype=np.unicode_)
arr4 = np.array([45, "罪己诏", "刘彻", "汉武帝"], dtype=np.unicode_)
print(arr1)
print(arr2)
print(arr3)
print(arr4)

# 创建全0数组
arr5 = np.zeros(4)
arr6 = np.zeros((2, 4))
print(arr5)
print(arr6)
# 创建全1数组
arr7 = np.ones(4)
arr8 = np.ones((2, 4))
print(arr7)
print(arr8)

# NumPy常用方法

#    numpy.arange(start, stop, step, dtype = None)
# ·start：表示开始的数字，默认起始值为0。
# ·stop：表示结束数字，在生成的序列里不包含结束数字。
# ·step：表示步长，数字类型，默认是1。如果指定了step，就必须指定start参数。
# ·dtype：表示数据类型。如果未指定，则根据其他参数推断数据类型。
# 创建等差数列
arr9 = np.arange(10)
arr99 = np.arange(100, 110)
arr10 = np.arange(0, 100, 20)
print(arr9)
print(arr10)

# 直接加减乘除运算等等
print(arr9 + 10)
print(arr9 * 10)
print(arr9 - 10)
print(arr9 / 10)
print(arr9 + arr99)
print(arr9 * arr99)
print(np.square(arr9))

# numpy科学计算函数
print(np.abs(-10))  # 求绝对值，该表达式返回10
print(np.around(1.2))  # 去掉小数位数，该表达式返回1
print(np.round_(1.7))  # 四舍五入，该表达式返回2
print(np.ceil(1.1))  # 求大于或等于该数的整数，该表达式返回2
print(np.floor(1.1))  # 求小于或等于该数的整数，该表达式返回1
print(np.sin(30 * np.pi / 180))  # 求30度的正弦值，转换成弧度，结果是0.5
print(np.cos(60 * np.pi / 180))  # 求60度的余弦值，转换成弧度，结果是0.5
print(np.sqrt(16))  # 求根号值，该表达式返回4
print(np.square(6))  # 求平方，该表达式返回36
print(np.sign(6))  # 符号函数，如果大于0则返回1，该表达式返回1
print(np.sign(-6))  # 符号函数，如果小0则返回-1，该表达式返回-1
print(np.sign(0))  # 符号函数，如果等于0则返回0，该表达式返回0
print(np.log10(100))  # 求以10为底的对数，该表达式返回2
print(np.log2(4))  # 求以2为底的对数，该表达式返回2
print(np.exp(1))  # 求以e为底的幂次方，该表达式返回e
print(np.power(2, 3))  # 求2的3次方，该表达式返回8
arr = np.array([-1, 3, 5])
print(np.abs(arr))  # [1 3 5]

# 常用的聚合统计函数
data = np.array([1, 3, 5, 7])
print(np.max(data))  # 找出最大值，输出为7
print(np.min(data))  # 找出最小值，输出为1
print(np.median(data))  # 找出中位数，输出为4
print(np.sum(data))  # 输出所有元素的和，结果是16
print(np.prod(data))  # 输出所有元素的积，结果是105
print(np.mean(data))  # 计算元素的平均数，结果是4
print(np.var(data))  # 计算元素的方差，结果是5
print(np.std(data))  # 计算元素的标准差，结果约为2.236

# 遍历
arr11 = np.array([[1, 2, 3], [7, 8, 9]])
for row in arr11:
    for item in row:
        print(item)
